import { _decorator, Component, Node, Camera, Vec3, UITransform, Canvas, } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('PlayerCamera')
export class PlayerCamera extends Component {
    
    @property(Camera)
    private PlayerCamera: Camera = null;
    @property(Node)
    private Canavs: Node = null;
    @property(Node)
    private Player1: Node = null;

    _canvasWidth = 0;
    _canvasHeight = 0;
    _canvasUITransform: UITransform = null;

    protected onLoad(): void {
        // 获取当前场景Canvas的UITransform来获取场景宽高
        this._canvasUITransform = this.Canavs.getComponent(UITransform);
        this._canvasWidth = this._canvasUITransform.width;
        this._canvasHeight = this._canvasUITransform.height;
        
    }
    
    update(deltaTime: number) {     
        //获取玩家位置（但不要直接用于相机位置）
        let Plyaer1Pos = this.Player1.position;
        //先获取角色位置坐标，后续边界限定时重置相机坐标值，即边界限定时相机的正确位置。
        //计算相机应跟随的目标位置（不直接赋值）
        //不要将玩家位置直接赋值给相机，要解耦合避免两个之间互相影响。
        let targetX = Plyaer1Pos.x;
        let targetY = Plyaer1Pos.y;
        //获取到玩家相机正交模式下相机视角高度即2d游戏下的宽高的高的值
        let cameraOrthoHeight = this.PlayerCamera.orthoHeight;
        //【摄像机视窗的宽高比和场景宽高比相同】
        // 必须使用场景宽高，引擎内摄像机宽高比和场景宽高比相同，和实际地图大小无关。
        // 根据场景宽高比计算出玩家相机的宽的值
        // 1、但由于在微信小游戏里不同设备有不同分辨率和宽高比，所以这里应该采用对应设备的宽高比去计算相机显示范围的宽用来限定边界
        // 2、横版游戏中勾选了适配高度，所以这里先测试只修改宽的左右边界限定看能否实现效果【不能生效，退回到使用canvas宽高比判断】
        // 3、#但是经过测试，修改相机这里的边界限定，在微信开发者工具或者微信小游戏平台，无法生效#
        // 4、因此只能选择，项目适配高度，地图左右两侧扩展出去地图，然后通过地图中左右边缘的元素添加碰撞体和障碍
        //    结合角色边界限定实现角色移动到地图边被障碍物拦住的效果   
        
        let cameraOrthoWidth = cameraOrthoHeight * (this._canvasWidth / this._canvasHeight);
        let halfCanvasHeight = this._canvasHeight / 2;
        let halfCanvasWidth = this._canvasWidth / 2;

        //计算相机实际允许的位置（考虑边界）
        let cameraX = targetX;
        let cameraY = targetY;




        // 摄像机锚点在正中心，相机边界超出地图边界时重置相机位置
        if(cameraX - cameraOrthoWidth < -1 * halfCanvasWidth){     //左边界
            cameraX = (-1 * halfCanvasWidth) + cameraOrthoWidth;
        } else if(cameraX + cameraOrthoWidth > halfCanvasWidth){   //右边界
            cameraX = halfCanvasWidth - cameraOrthoWidth;
        }
        if(cameraY - cameraOrthoHeight < -1 * halfCanvasHeight){   //下边界
            cameraY = (-1 * halfCanvasHeight) + cameraOrthoHeight;
        } else if(cameraY + cameraOrthoHeight > halfCanvasHeight){ //上边界
            cameraY = halfCanvasHeight - cameraOrthoHeight;
        }

        //更新玩家相机正确位置
        this.PlayerCamera.node.setPosition(cameraX, cameraY);
    }
}


